package com.zjyd.douyangcommonsatoken.exception;

import com.zjyd.douyangcommoncore.result.Result;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 参数校验异常处理
 */
/**
 * 参数校验异常处理（按字段分组返回错误）
 */
@RestControllerAdvice
public class ParameterExceptionHandler {

    /**
     * 处理参数校验失败异常（按字段分组错误信息）
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        // 1. 按字段分组收集错误信息：key=字段名，value=错误信息列表
        Map<String, List<String>> fieldErrorMap = new HashMap<>();

        // 遍历所有字段错误（FieldError包含字段名信息，比ObjectError更具体）
        for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
            String field = fieldError.getField(); // 获取字段名（如username）
            String errorMsg = fieldError.getDefaultMessage(); // 获取错误消息

            // 将错误信息添加到对应字段的列表中
            fieldErrorMap.computeIfAbsent(field, k -> new ArrayList<>()).add(errorMsg);
        }

        // 2. 转换为通用的错误详情列表（可选，也可直接返回Map）
        List<ParamErrorDetail> errorDetails = fieldErrorMap.entrySet().stream()
                .map(entry -> new ParamErrorDetail(entry.getKey(), entry.getValue()))
                .collect(Collectors.toList());

        // 3. 返回统一结果：状态码400，消息提示，数据为错误详情
        return Result.error(400, "参数校验失败")
                .data(errorDetails); // 若用Map则直接传fieldErrorMap
    }
}
